package name.marz.to.go.btree.node;

public interface Node extends Acceptor,Cloneable {
	/**
	 * 左側のポインタを取得する
	 * @return
	 */
	public abstract Object getLeftPointer();

	/**
	 * 格納できるキーの数を取得する
	 * @return
	 */
	public abstract int getMaxKeys();
	abstract void setMaxKeys(int keycount);

	/**
	 * 格納されているキーの数を取得する
	 * @return
	 */
	public abstract int getKeyCount();

	/**
	 * キー値が示すポインタを取得する。<br>
	 * 
	 * 
	 * @param key
	 * @return
	 */
	public abstract Object getPointer(Key key);

	/**
	 * 指定されたインデックスのポインタを取得する
	 * 
	 * @param index
	 * @return
	 */
	public abstract Object getPointer(int index);

	/**
	 * 指定されたインデックスのキー値を取得する
	 * 
	 * @param index
	 * @return
	 */
	public abstract Key getKey(int index);

	/**
	 * 葉ノードかどうかを取得する
	 * @return trueなら葉ノード
	 */
	public abstract boolean isLeaf();

	/**
	 * 指定されたキーを保持しているかどうかを取得する<br>
	 * 当該Nodeが保持しているかどうかのみを返す。（子ノードが保持しているかどうかではない）
	 * @param key
	 * @return trueならkeyを保持している
	 */
	public abstract boolean hasKey(Key key);

	/**
	 * Nodeが保持する最初のキー値を取得する。<br>
	 * すなわち、最小キーである。
	 * @return
	 */
	public abstract Key getFirstKey();
	
	/**
	 * 指定されたキーを削除する
	 * @param key
	 */
	public abstract void remove(Key key);
	/**
	 * キー値を追加する
	 * @param key
	 * @param pointer
	 * @throws NodeOverflowException	ノードが溢れたときスローされる
	 */
	public abstract void add(Key key, Object pointer) throws NodeOverflowException;
	/**
	 * Nodeの中味をクリアする
	 */
	public abstract void clear();

	/**
	 * このインスタンスと同じ数のキー値、ポインタを持つ新しいNodeインスタンスを生成する。<br>
	 * 格納エリアを生成するのみであり、中味はNULLである。
	 * @return
	 */
//	public abstract Node newNode();
	
	/**
	 * Nodeを分割する。
	 * 
	 * @return 分割後の新しいNode
	 */
	public abstract Node split();

	public abstract void setLeftPointer(Object leftPointer);
	
	public abstract String getName();
	public abstract void setName(String name);

	public abstract Object clone() throws CloneNotSupportedException;
	// memento
//	public NodeMemento save();
//	public void restore(NodeMemento m);

}